package db

import (
	"fmt"
	"gitee.com/love_bass/go-utils/utils"
	"go-base/configs"
	"gorm.io/driver/postgres"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"log"
	"os"
	"strconv"
	"time"
)

func initPostgres() {
	if _, err := utils.IsValidPort(strconv.Itoa(config.Postgres.Port)); err != nil {
		log.Fatalf("数据库端口不合法：%d", config.Postgres.Port)
	}

	// 生成dsn
	dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%d sslmode=disable TimeZone=Asia/Shanghai",
		config.Postgres.Host,
		config.Postgres.Username,
		config.Postgres.Password,
		config.Postgres.Database,
		config.Postgres.Port,
	)
	// 定义日志打印
	var newLogger logger.Interface = nil
	if configs.Data.Main.PrintSql {
		newLogger = logger.New(
			log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer（日志输出到标准输出）
			logger.Config{
				SlowThreshold:             time.Second, // 慢 SQL 阈值
				LogLevel:                  logger.Info, // 日志级别
				IgnoreRecordNotFoundError: true,        // 忽略ErrRecordNotFound错误
				Colorful:                  true,        // 禁用/启用彩色打印
			},
		)
	}
	var err error
	// 连接到 PostgreSQL 数据库
	Context, err = gorm.Open(postgres.Open(dsn), &gorm.Config{
		Logger: newLogger,
	})
	if err != nil {
		log.Printf("数据库连接失败：%v", err)
		os.Exit(1)
	}

	sqlDB, err := Context.DB()
	if err != nil {
		log.Printf("无法获取泛型数据库对象：%v", err)
		os.Exit(1)
	}
	sqlDB.SetMaxIdleConns(10)
	sqlDB.SetMaxOpenConns(100)
	sqlDB.SetConnMaxLifetime(time.Hour)
	sqlDB.SetConnMaxIdleTime(5 * time.Minute)

	// 在进行数据库操作之前尝试连接
	if err := sqlDB.Ping(); err != nil {
		log.Printf("无法 ping 数据库：%v", err)
		os.Exit(1)
	}
	log.Printf("数据库连接已建立并已成功执行 ping 操作")

	// 迁移数据结构
	if err := migrate(); err != nil {
		log.Printf("数据迁移失败：%v", err)
		os.Exit(1)
	}
	log.Printf("数据库迁移成功")
	log.Printf("导入初始化Mock数据...")
	log.Printf("数据库初始化完毕...")
}
